// 导入必要的包和库
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;  // HTTP 客户端库
import 'package:shared_preferences/shared_preferences.dart';
import 'package:xiaozhou_ams_flutter/tools.dart';

// 创建一个名为 ApiClient 的类，用于处理 API 请求
class ApiClient {
  // 定义 API 的基本 URL 常量
  static const String baseUrl = 'http://api.aiyuye.shop';

  // 定义一个发送带有表单数据的 POST 请求的方法
  static Future<String?> sendPostRequest(String endpoint, Map<String, dynamic> formData) async {
    // 构建特定端点的完整 URL
    final prefs = await SharedPreferences.getInstance();
    final String? token = prefs.getString('userToken');
    final url = Uri.parse('$baseUrl/$endpoint');

    try {
      // 创建一个 MultipartRequest 实例，用于发送表单数据
      final request = http.MultipartRequest('POST', url);
      // 向请求中添加表单字段
      formData.forEach((key, value) {
        request.fields[key] = value.toString();
      });

      // 添加请求头
      request.headers.addAll({
        'token': token.toString()
      });

      // 发送请求并等待响应
      final response = await request.send();

      // 检查响应状态码是否为 200（OK）
      if (response.statusCode == 200) {
        // 读取并解码响应流为字符串

        final responseBody = await response.stream.bytesToString();
        // 将响应数据打印到控制台
        if (kDebugMode) {
          print('响应数据: $responseBody');
        }

        // 返回响应体
        return responseBody;
      }else {
        // 如果请求失败，打印错误消息
        final responseBody = await response.stream.bytesToString();
        if (kDebugMode) {
          print('请求失败，状态码: ${response.statusCode}');
        }
        if (kDebugMode) {
          print('响应数据: $responseBody');
        }
        SnackbarHelper.showToast('请求失败，服务器错误，请联系系统管理员！');
        // 如果请求失败，返回空字符串
        return null;
      }
    } catch (error) {
      // 如果在请求过程中发生异常，打印错误消息
      SnackbarHelper.showToast('请求失败，服务器错误，请联系系统管理员！');
      if (kDebugMode) {
        print('错误: $error');
      }

      // 如果发生异常，返回空字符串
      return null;
    }
  }
  static Future<String?> sendPostRequestNoToken(String endpoint, Map<String, dynamic> formData) async {
    // 构建特定端点的完整 URL
    final url = Uri.parse('$baseUrl/$endpoint');
    if (kDebugMode) {
      print(url);
    }

    try {
      // 将表单数据转换为 JSON 字符串
      final String jsonString = json.encode(formData);

      // 发送 JSON 格式的 POST 请求
      final response = await http.post(
        url,
        headers: {"Content-Type": "application/json"},
        body: jsonString,
      );

      // 检查响应状态码是否为 200（OK）
      if (response.statusCode == 200) {
        // 如果响应成功，打印并返回响应体
        final responseBody = response.body;
        if (kDebugMode) {
          print('响应数据: $responseBody');
        }
        return responseBody;
      }else if(response.statusCode == 500){
        final responseBody = response.body;
        print('响应数据: $responseBody');
        SnackbarHelper.showToast('登录失效，请重新登录!');
      }else {
        // 如果请求失败，打印错误消息
        if (kDebugMode) {
          print('请求失败，状态码: ${response.statusCode}');
          print('响应数据: ${response.body}');
        }
        // 展示失败消息
        SnackbarHelper.showToast('请求失败，服务器错误，请联系系统管理员！');
        return null;
      }
    } catch (error) {
      // 如果在请求过程中发生异常，打印并展示错误消息
      SnackbarHelper.showToast('请求失败，服务器错误，请联系系统管理员！');
      if (kDebugMode) {
        print('错误: $error');
      }
      return null;
    }
    return null;
  }
  // 定义一个函数，用于发送 x-www-form-urlencoded 格式的请求
  static Future<String?> sendFormUrlEncodedRequest(String url, Map<String, dynamic> data) async {
    // 将传入的数据转换为 URL 编码字符串
    // String body = data.keys.map((key) => "$key=${Uri.encodeComponent(data[key].toString())}").join("&");

    try {
      // 发送 POST 请求
      http.Response response = await http.post(
        Uri.parse(url),
        // 提交转换后的数据
        body: data,
      );

      // 检查响应状态码
      if (response.statusCode == 200) {
        // 如果服务器返回了 200 OK，打印响应体
        print("Response body: ${response.body}");
        final decodedString = utf8.decode(response.bodyBytes);
        return decodedString;
      }else if(response.statusCode == 401){
        print("Response body: ${response.body}");
        final decodedString = response.bodyBytes.toString();
        return decodedString;
      } else {
        // 如果服务器返回了错误状态码，打印状态码和响应体
        print("Error: ${response.statusCode}");
        print("Error body: ${response.body}");
        return null;
      }
    } catch (e) {
      // 捕获并打印异常
      print("Exception occurred: $e");
    }
    return null;
  }
  // 定义一个发送 Get 请求的方法
  static Future<String?> sendGetRequest(String endpoint) async {
    // 构建特定端点的完整 URL
    final prefs = await SharedPreferences.getInstance();
    final String? token = prefs.getString('userToken');
    final url = Uri.parse('$baseUrl/$endpoint');
    try{
      final request = http.MultipartRequest('GET', url);
      request.headers.addAll({ // 添加请求头
        'token': token.toString()
      });
      // 发送请求并等待响应
      final response = await request.send();
      
      // 检查响应状态码是否为 200（OK）
      if (response.statusCode == 200) {
        // 读取并解码响应流为字符串

        final responseBody = await response.stream.bytesToString();
        // 将响应数据打印到控制台
        if (kDebugMode) {
          print('响应数据: $responseBody');
        }
        // 返回响应体
        return responseBody;
      } else {
        // 如果请求失败，打印错误消息
        final responseBody = await response.stream.bytesToString();
        if (kDebugMode) {
          print('请求失败，状态码: ${response.statusCode}');
        }
        if (kDebugMode) {
          print('响应数据: $responseBody');
        }
        SnackbarHelper.showToast('请求失败，服务器错误，请联系系统管理员！');
        // 如果请求失败，返回空字符串
        return null;
      }
    }catch(error){
      SnackbarHelper.showToast('请求失败，服务器错误，请联系系统管理员！');
      if (kDebugMode) {
        print('错误: $error');
      }
      // 如果发生异常，返回空字符串
      return null;
    }

  }

}
